package etresVivant;

import java.util.Random;

import model.Case;
import model.Fourmiliere;
import model.Terrain;
import roles.Ouvriere;
import roles.Reine;
import roles.Role;
import roles.Sexue;
import roles.Soldat;
import typesEnum.Evolution;
import typesEnum.Sexe;
import typesEnum.Statut;

public class Fourmi extends EtreVivant {

	private Evolution etat;
	private final Role role;
	private final Sexe sexe;
	private boolean peutManger;
	private boolean nourrit;
	
	public Fourmi(Role _role, Case c, Evolution e, Sexe s, boolean miam) {
		super();
		m_case = c;
		esperance = _role.calculVie();
		poids = _role.calculPoids();
		role = _role;
		etat = e;
		sexe = s;
		peutManger = miam;
		nourrit = false;
	}
	
	public Evolution getEtat() {
		return etat;
	}

	public Role getRole() {
		return role;
	}

	public Sexe getSexe() {
		return sexe;
	}
	
	@Override
	public void vieillir() {
		super.vieillir();
		this.statut = testSurvie();
	}
	
	/**
	 * cree une nouvelle fourmi avec le role de reine
	 * et qui cree une fourmiliere.
	 * @param la case ou la reine doit s'installer
	 * @return une fourmi avec le role de reine.
	 */
	public static Fourmi newReine(Case c) {
		Reine r = new Reine();
		Fourmi reine = new Fourmi(new Reine(), c, Evolution.ADULTE,
				Sexe.FEMELLE, true);
		Fourmiliere f = r.creerFourmiliere(reine, c);
		Terrain.fourmilieres.add(f);
		return reine;
	}
	
	/**
	 * cree une fourmi avec un role d'ouvriere.
	 * @param la case de la fourmiliere.
	 */
	public static Fourmi newOuvriere(Case c) {
		return (new Fourmi(new Ouvriere(), c, Evolution.OEUF, Sexe.FEMELLE,
				false));
	}
	
	/**
	 * cree une fourmi avec un role de soldat.
	 * @param la case de la fourmiliere
	 */
	public static Fourmi newSoldat(Case c) {
		return (new Fourmi(new Soldat(), c, Evolution.OEUF, Sexe.FEMELLE, false));
	}
	
	/**
	 * cree une fourmi avec une role de sexuee.
	 * @param la case de la fourmiliere
	 */
	public static Fourmi newSexue(Case c) {
		Sexe s;
		Random rd = new Random();
		int n = rd.nextInt(2);
		if (n == 0) {
			s = Sexe.MALE;
		} else {
			s = Sexe.FEMELLE;
		}
		return (new Fourmi(new Sexue(), c, Evolution.OEUF, s, false));
	}

	/**
	 * test de survie d'une fourmi en fonction de son age si
	 * il a passé son esperance de vie et en fonction si elle
	 * a bien eu sa part de nourriture journaliere
	 * @return le nouveau statut de la fourmi
	 */
	public Statut testSurvie() {

		Statut nvStatut;
		if (esperance < ageJour || !nourrit) {
			nvStatut = Statut.NON_COMESTIBLE;
		} else {
			nvStatut = Statut.VIVANT;
		}

		nourrit = false;
		return nvStatut;
	}

	/**
	 * Verifie l'etat d'evolution de la fourmi si il a besoin
	 * d'etre mis a jour en fonction de son age.
	 * OEUF -> LARVE -> NYMPHE -> ADULTE
	 */
	public void evoluer() {
		if (etat == Evolution.OEUF && ageJour == 3) {
			etat = Evolution.LARVE;
			ageJour = 0;
			peutManger = true;
			poids *= 3.0f;
		} else if (etat == Evolution.LARVE && ageJour == 10) {
			etat = Evolution.NYMPHE;
			ageJour = 0;
			peutManger = false;
		} else if (etat == Evolution.NYMPHE && ageJour == 17) {
			etat = Evolution.ADULTE;
			ageJour = 0;
			peutManger = true;
			poids /= 3.0f;
		}		
	}
	
	/**
	 * nourrit la fourmi en fonction de son etat (ADULTE OU LARVE)
	 * @param stock le stock de nourriture existant.
	 * @return la nouvelle quantite de stock de nourriture.
	 */
	public float seNourrir(float stock) {
		if (peutManger && !nourrit) {
			switch (etat) {
			case ADULTE:
				if ((poids / 3.0f) < stock) {
					stock -= poids / 3.0f;
					nourrit = true;
				}
				break;
			case LARVE:
				if (poids < stock) {
					stock -= poids;
					nourrit = true;
				}
				break;
			default:
				break;
			}
		} else {
			nourrit = true; // Pour eviter de tuer les oeufs et les nymphes car
							// ils n'ont pas besoins de se nourrir
		}
		return stock;
	}
}
